package com.server.Tomcat.controller;

import com.proto_java.PBAccountNumber;
import com.proto_java.PBGroupInfo;
import com.server.Tomcat.service.service_impl.AccountNumberImpl;
import com.server.tools.Code;
import com.server.tools.ProtoBufTools;
import com.server.tools.PublicUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

/**
 * 账号管理接口,登录、注册、修改密码等
 */
@RestController
@RequestMapping("/accountNumbers")
public class AccountNumberController {

    @Autowired
    AccountNumberImpl accountNumber;

    /**
     * 处理登录请求
     * @param proto 数据包
     * @return 初始化内容
     */
    @PostMapping("/login")
    public ResponseEntity<byte[]> login(@RequestBody byte[] proto){
        // 拿到数据类
        PBAccountNumber.AccountNumber lastData = ProtoBufTools.get(proto).getAccountNumber();
        // 交给处理方法
        return PublicUtils.setProtobufHeader(accountNumber.login(lastData));
    }


    /**
     * 初始化主页数据
     * @return 返回结果
     */
    @GetMapping("/init")
    public ResponseEntity<byte[]> init(@RequestAttribute("uid") Long uid){
        // 从请求属性Attribute中拿出uid,验证成功后返回初始化数据
        return PublicUtils.setProtobufHeader(accountNumber.init(uid));
    }


    /**
     * 处理token验证
     * @return 返回结果
     */
    @GetMapping("/verifyToken")
    public ResponseEntity<byte[]> verifyToken(){
        // 能走到这里说明在拦截器中已经验证通过了,直接返回即可
        return PublicUtils.setProtobufHeader(ProtoBufTools.getResponseClass(Code.OK,"验证通过"));
    }


    /**
     * 昵称+密码注册新用户
     * @return 返回结果
     */
    @PostMapping("/register")
    public ResponseEntity<byte[]> register(@RequestBody byte[] proto){
        // 转换proto类
        PBAccountNumber.AccountNumber data = ProtoBufTools.get(proto).getAccountNumber();
        // 返回数据
        return PublicUtils.setProtobufHeader(accountNumber.register(data.getName(), data.getPassword()));
    }


    /**
     * 搜索Uid并返回对象信息
     * @param uid 收到的数据
     * @return 如果存在则返回信息
     */
    @GetMapping("/searchUid/{uid}")
    public ResponseEntity<byte[]> searchUid(@PathVariable("uid") Long uid){
        return  PublicUtils.setProtobufHeader(accountNumber.searchUid(uid));
    }

    /**
     * 拿出token的uid,然后注销(逻辑注销对应的用户)
     * @param uid 解析出的uid
     * @return 注销结果
     */
    @GetMapping("/deleteAccount")
    public ResponseEntity<byte[]> deleteAccount(@RequestAttribute("uid") Long uid){
        return PublicUtils.setProtobufHeader(accountNumber.deleteAccount(uid));
    }


    /**
     * 修改密码
     * @param uid token中拿到用户uid
     * @param password 新旧密码数据包
     * @return 修改结果
     */
    @PostMapping("/updatePassword")
    public ResponseEntity<byte[]> updatePassword(@RequestAttribute("uid") Long uid,@RequestBody byte[] password){
        // 转换proto类
        PBAccountNumber.AccountNumber data = ProtoBufTools.get(password).getAccountNumber();
        // 返回数据
        return PublicUtils.setProtobufHeader(accountNumber.updatePassword(uid,data.getPassword(), data.getNewPassword()));
    }


    /**
     * 更新用户头像和名字
     * @param uid 用户uid
     * @param proto 头像和名字的数据包
     * @return 更新结果
     */
    @PostMapping("/updateHeadImageOrName")
    public ResponseEntity<byte[]> updateHeadImageOrName(@RequestAttribute("uid") Long uid,@RequestBody byte[] proto){
        // 转换proto类
        PBAccountNumber.AccountNumber data = ProtoBufTools.get(proto).getAccountNumber();
        // 返回数据
        return PublicUtils.setProtobufHeader(accountNumber.updateHeadImageOrName(uid,data.getName(), data.getImage()));
    }


    /**
     * 更新用户头像和名字
     * @param uid 用户uid
     * @param proto 群信息的protobuf对象
     * @return 群信息初始化对象
     */
    @PostMapping("/createGroup")
    public ResponseEntity<byte[]> createGroup(@RequestAttribute("uid") Long uid,@RequestBody byte[] proto){
        // 转换proto类
        PBGroupInfo.GroupInfo data = ProtoBufTools.get(proto).getGroupInfo();
        // 返回数据
        return PublicUtils.setProtobufHeader(accountNumber.createGroup(uid,data.getName()));
    }

}
